package com.hb.common.ws;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 数据备份日志接口
 */
@ServerEndpoint(value = "/chat/{id}", configurator = GetHttpSessionConfig.class)
@Component
@Slf4j
public class BackupEndpoint {
    // 线程安全
    private static final Map<String, Session> onlineUsers = new ConcurrentHashMap<>();
    private HttpSession httpSession;

    // 建立 websocket 连接后，被调用
    @OnOpen
    public void onOpen(Session session,  @PathParam("id") String id) {
        onlineUsers.put(id, session);
    }

    public Set<String> getFriends() {
        return onlineUsers.keySet();
    }

    private void broadcastAllUsers(String message) {
        try {
            // 遍历 map 集合
            for (Session session : onlineUsers.values()) {
                // 发送消息
                session.getBasicRemote().sendText(message);
            }
        } catch (Exception e) {
            // 记录日志
            log.error("业务异常",e);
        }
    }

    // 浏览器发送消息到服务端，该方法被调用
    @OnMessage
    public void onMessage(String message) {

    }

    // 断开 websocket 连接时被调用
    @OnClose
    public void onClose(Session session, @PathParam("id") String id) {
        // 1, 从 onlineUsers 中剔除当前用户的 session 对
        onlineUsers.remove(id);
    }

    // 新增方法：发送消息给特定用户
    public void sendMessageToUser(String id, String message) {
        try {
            Session session = onlineUsers.get(id);
            if (session != null) {
                session.getBasicRemote().sendText(message);
            }
        } catch (Exception e) {
            // 记录日志
            log.error("业务异常",e);
        }
    }
}
